home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / lisp / vm / vm-mouse.el.z / vm-mouse.el
Encoding:
Text File  |  1998-05-21  |  19.0 KB  |  515 lines

  1. ;;; Mouse related functions and commands
  2. ;;; Copyright (C) 1995-1997 Kyle E. Jones
  3. ;;;
  4. ;;; This program is free software; you can redistribute it and/or modify
  5. ;;; it under the terms of the GNU General Public License as published by
  6. ;;; the Free Software Foundation; either version 1, or (at your option)
  7. ;;; any later version.
  8. ;;;
  9. ;;; This program is distributed in the hope that it will be useful,
  10. ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;;; GNU General Public License for more details.
  13. ;;;
  14. ;;; You should have received a copy of the GNU General Public License
  15. ;;; along with this program; if not, write to the Free Software
  16. ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. (provide 'vm-mouse)
  19.  
  20. (defun vm-mouse-fsfemacs-mouse-p ()
  21.   (and vm-fsfemacs-p
  22.        (fboundp 'set-mouse-position)))
  23.  
  24. (defun vm-mouse-xemacs-mouse-p ()
  25.   (and vm-xemacs-p
  26.        (fboundp 'set-mouse-position)))
  27.  
  28. (defun vm-mouse-set-mouse-track-highlight (start end &optional overlay)
  29.   (if (null overlay)
  30.     (cond (vm-fsfemacs-p
  31.            (let ((o (make-overlay start end)))
  32.          (overlay-put o 'mouse-face 'highlight)
  33.          o ))
  34.           (vm-xemacs-p
  35.            (let ((o (make-extent start end)))
  36.          (set-extent-property o 'start-open t)
  37.          (set-extent-property o 'priority 10)
  38.          (set-extent-property o 'highlight t)
  39.          o )))
  40.     (cond (vm-fsfemacs-p
  41.        (move-overlay overlay start end))
  42.       (vm-xemacs-p
  43.        (set-extent-endpoints overlay start end)))))
  44.  
  45. (defun vm-mouse-button-2 (event)
  46.   (interactive "e")
  47.   ;; go to where the event occurred
  48.   (cond ((vm-mouse-xemacs-mouse-p)
  49.      (set-buffer (window-buffer (event-window event)))
  50.      (and (event-point event) (goto-char (event-point event))))
  51.     ((vm-mouse-fsfemacs-mouse-p)
  52.      (set-buffer (window-buffer (posn-window (event-start event))))
  53.      (goto-char (posn-point (event-start event)))))
  54.   ;; now dispatch depending on where we are
  55.   (cond ((eq major-mode 'vm-summary-mode)
  56.      (mouse-set-point event)
  57.      (beginning-of-line)
  58.      (if (let ((vm-follow-summary-cursor t))
  59.            (vm-follow-summary-cursor))
  60.          nil
  61.        (setq this-command 'vm-scroll-forward)
  62.        (call-interactively 'vm-scroll-forward)))
  63.     ((memq major-mode '(vm-mode vm-virtual-mode vm-presentation-mode))
  64.      (vm-mouse-popup-or-select event))))
  65.  
  66. (defun vm-mouse-button-3 (event)
  67.   (interactive "e")
  68.   (if vm-use-menus
  69.       (progn
  70.     ;; go to where the event occurred
  71.     (cond ((vm-mouse-xemacs-mouse-p)
  72.            (set-buffer (window-buffer (event-window event)))
  73.            (and (event-point event) (goto-char (event-point event))))
  74.           ((vm-mouse-fsfemacs-mouse-p)
  75.            (set-buffer (window-buffer (posn-window (event-start event))))
  76.            (goto-char (posn-point (event-start event)))))
  77.     ;; now dispatch depending on where we are
  78.     (cond ((eq major-mode 'vm-summary-mode)
  79.            (vm-menu-popup-mode-menu event))
  80.           ((eq major-mode 'vm-mode)
  81.            (vm-menu-popup-context-menu event))
  82.           ((eq major-mode 'vm-presentation-mode)
  83.            (vm-menu-popup-context-menu event))
  84.           ((eq major-mode 'vm-virtual-mode)
  85.            (vm-menu-popup-context-menu event))
  86.           ((eq major-mode 'mail-mode)
  87.            (vm-menu-popup-context-menu event))))))
  88.  
  89. (defun vm-mouse-3-help (object)
  90.   nil
  91.   "Use mouse button 3 to see a menu of options.")
  92.  
  93. (defun vm-mouse-get-mouse-track-string (event)
  94.   (save-excursion
  95.     ;; go to where the event occurred
  96.     (cond ((vm-mouse-xemacs-mouse-p)
  97.        (set-buffer (window-buffer (event-window event)))
  98.        (and (event-point event) (goto-char (event-point event))))
  99.       ((vm-mouse-fsfemacs-mouse-p)
  100.        (set-buffer (window-buffer (posn-window (event-start event))))
  101.        (goto-char (posn-point (event-start event)))))
  102.     (cond (vm-fsfemacs-p
  103.        (let ((o-list (overlays-at (point)))
  104.          (string nil))
  105.          (while o-list
  106.            (if (overlay-get (car o-list) 'mouse-face)
  107.            (setq string (vm-buffer-substring-no-properties
  108.                  (overlay-start (car o-list))
  109.                  (overlay-end (car o-list)))
  110.              o-list nil)
  111.          (setq o-list (cdr o-list))))
  112.          string ))
  113.       (vm-xemacs-p
  114.        (let ((e (extent-at (point) nil 'highlight)))
  115.          (if e
  116.          (buffer-substring (extent-start-position e)
  117.                    (extent-end-position e))
  118.            nil)))
  119.       (t nil))))
  120.  
  121. (defun vm-mouse-popup-or-select (event)
  122.   (interactive "e")
  123.   (cond ((vm-mouse-fsfemacs-mouse-p)
  124.      (set-buffer (window-buffer (posn-window (event-start event))))
  125.      (goto-char (posn-point (event-start event)))
  126.      (let (o-list (found nil))
  127.        (setq o-list (overlays-at (point)))
  128.        (while (and o-list (not found))
  129.          (cond ((overlay-get (car o-list) 'vm-url)
  130.             (setq found t)
  131.             (vm-mouse-send-url-at-event event))
  132.            ((overlay-get (car o-list) 'vm-mime-function)
  133.             (setq found t)
  134.             (funcall (overlay-get (car o-list) 'vm-mime-function)
  135.                  (car o-list))))
  136.          (setq o-list (cdr o-list)))
  137.        (and (not found) (vm-menu-popup-context-menu event))))
  138.     ;; The XEmacs code is not actually used now, since all
  139.     ;; selectable objects are handled by an extent keymap
  140.     ;; binding that points to a more specific function.  But
  141.     ;; this might come in handy later if I want selectable
  142.     ;; objects that don't have an extent or extent keymap
  143.     ;; attached.
  144.     ((vm-mouse-xemacs-mouse-p)
  145.      (set-buffer (window-buffer (event-window event)))
  146.      (and (event-point event) (goto-char (event-point event)))
  147.      (let (e)
  148.        (cond ((extent-at (point) (current-buffer) 'vm-url)
  149.           (vm-mouse-send-url-at-event event))
  150.          ((setq e (extent-at (point) nil 'vm-mime-function))
  151.           (funcall (extent-property e 'vm-mime-function) e))
  152.          (t (vm-menu-popup-context-menu event)))))))
  153.  
  154. (defun vm-mouse-send-url-at-event (event)
  155.   (interactive "e")
  156.   (cond ((vm-mouse-xemacs-mouse-p)
  157.      (set-buffer (window-buffer (event-window event)))
  158.      (and (event-point event) (goto-char (event-point event)))
  159.      (vm-mouse-send-url-at-position (event-point event)))
  160.     ((vm-mouse-fsfemacs-mouse-p)
  161.      (set-buffer (window-buffer (posn-window (event-start event))))
  162.      (goto-char (posn-point (event-start event)))
  163.      (vm-mouse-send-url-at-position (posn-point (event-start event))))))
  164.  
  165. (defun vm-mouse-send-url-at-position (pos &optional browser)
  166.   (save-restriction
  167.     (widen)
  168.     (cond ((vm-mouse-xemacs-mouse-p)
  169.        (let ((e (extent-at pos (current-buffer) 'vm-url))
  170.          url)
  171.          (if (null e)
  172.          nil
  173.            (setq url (buffer-substring (extent-start-position e)
  174.                        (extent-end-position e)))
  175.            (vm-mouse-send-url url browser))))
  176.       ((vm-mouse-fsfemacs-mouse-p)
  177.        (let (o-list url o)
  178.          (setq o-list (overlays-at pos))
  179.          (while (and o-list (null (overlay-get (car o-list) 'vm-url)))
  180.            (setq o-list (cdr o-list)))
  181.          (if (null o-list)
  182.          nil
  183.            (setq o (car o-list))
  184.            (setq url (vm-buffer-substring-no-properties
  185.               (overlay-start o)
  186.               (overlay-end o)))
  187.            (vm-mouse-send-url url browser)))))))
  188.  
  189. (defun vm-mouse-send-url (url &optional browser)
  190.   (if (string-match "^mailto:" url)
  191.       (vm-mail-to-mailto-url url)
  192.     (let ((browser (or browser vm-url-browser)))
  193.       (cond ((symbolp browser)
  194.          (funcall browser url))
  195.         ((stringp browser)
  196.          (message "Sending URL to %s..." browser)
  197.          (vm-run-background-command browser url)
  198.          (message "Sending URL to %s... done" browser))))))
  199.  
  200. (defun vm-mouse-send-url-to-netscape (url &optional new-netscape new-window)
  201.   (message "Sending URL to Netscape...")
  202.   (if new-netscape
  203.       (apply 'vm-run-background-command vm-netscape-program
  204.          (append vm-netscape-program-switches (list url)))
  205.     (or (equal 0 (apply 'vm-run-command vm-netscape-program "-remote" 
  206.             (append (list (concat "openURL(" url
  207.                           (if new-window ", new-window" "")
  208.                           ")"))
  209.                 vm-netscape-program-switches)))
  210.     (vm-mouse-send-url-to-netscape url t new-window)))
  211.   (message "Sending URL to Netscape... done"))
  212.  
  213. (defun vm-mouse-send-url-to-netscape-new-window (url)
  214.   (vm-mouse-send-url-to-netscape url nil t))
  215.  
  216. (defun vm-mouse-send-url-to-mosaic (url &optional new-mosaic new-window)
  217.   (message "Sending URL to Mosaic...")
  218.   (if (null new-mosaic)
  219.       (let ((pid-file "~/.mosaicpid")
  220.         (work-buffer " *mosaic work*")
  221.         (coding-system-for-read 'no-conversion)
  222.         (coding-system-for-write 'no-conversion)
  223.         pid)
  224.     (cond ((file-exists-p pid-file)
  225.            (set-buffer (get-buffer-create work-buffer))
  226.            (erase-buffer)
  227.            (insert-file-contents pid-file)
  228.            (setq pid (int-to-string (string-to-int (buffer-string))))
  229.            (erase-buffer)
  230.            (insert (if new-window "newwin" "goto") ?\n)
  231.            (insert url ?\n)
  232.            ;; newline convention used should be the local
  233.            ;; one, whatever that is.
  234.            (setq buffer-file-type nil)
  235.            (and vm-xemacs-mule-p
  236.             (set-buffer-file-coding-system 'no-conversion nil))
  237.            (write-region (point-min) (point-max)
  238.                  (concat "/tmp/Mosaic." pid)
  239.                  nil 0)
  240.            (set-buffer-modified-p nil)
  241.            (kill-buffer work-buffer)))
  242.     (cond ((or (null pid)
  243.            (not (equal 0 (vm-run-command "kill" "-USR1" pid))))
  244.            (setq new-mosaic t)))))
  245.   (if new-mosaic
  246.      (apply 'vm-run-background-command vm-mosaic-program
  247.         (append vm-mosaic-program-switches (list url))))
  248.   (message "Sending URL to Mosaic... done"))
  249.  
  250. (defun vm-mouse-send-url-to-mosaic-new-window (url)
  251.   (vm-mouse-send-url-to-mosaic url nil t))
  252.  
  253. (defun vm-mouse-install-mouse ()
  254.   (cond ((vm-mouse-xemacs-mouse-p)
  255.      (if (null (lookup-key vm-mode-map 'button2))
  256.          (define-key vm-mode-map 'button2 'vm-mouse-button-2)))
  257.     ((vm-mouse-fsfemacs-mouse-p)
  258.      (if (null (lookup-key vm-mode-map [mouse-2]))
  259.          (define-key vm-mode-map [mouse-2] 'vm-mouse-button-2))
  260.      (if vm-popup-menu-on-mouse-3
  261.          (progn
  262.            (define-key vm-mode-map [mouse-3] 'ignore)
  263.            (define-key vm-mode-map [down-mouse-3] 'vm-mouse-button-3))))))
  264.  
  265. (defun vm-run-background-command (command &rest arg-list)
  266.   (apply (function call-process) command nil 0 nil arg-list))
  267.  
  268. (defun vm-run-command (command &rest arg-list)
  269.   (apply (function call-process) command nil nil nil arg-list))
  270.  
  271. ;; return t on zero exit status
  272. ;; return (exit-status . stderr-string) on nonzero exit status
  273. (defun vm-run-command-on-region (start end output-buffer command
  274.                        &rest arg-list)
  275.   (let ((tempfile nil)
  276.     ;; for DOS/Windows command to tell it that its input is
  277.     ;; binary.
  278.     (binary-process-input t)
  279.     status errstring)
  280.     (unwind-protect
  281.     (progn
  282.       (setq tempfile (vm-make-tempfile-name))
  283.       (setq status
  284.         (apply 'call-process-region
  285.                start end command nil
  286.                (list output-buffer tempfile)
  287.                nil arg-list))
  288.       (cond ((equal status 0) t)
  289.         ;; even if exit status non-zero, if there was no
  290.         ;; diagnostic output the command probably
  291.         ;; succeeded.  I have tried to just use exit status
  292.         ;; as the failure criterion and users complained.
  293.         ((equal (nth 7 (file-attributes tempfile)) 0)
  294.          (message "%s exited non-zero (code %s)" command status)
  295.          t)
  296.         (t (save-excursion
  297.              (message "%s exited non-zero (code %s)" command status)
  298.              (set-buffer (find-file-noselect tempfile))
  299.              (setq errstring (buffer-string))
  300.              (kill-buffer nil)
  301.              (cons status errstring)))))
  302.       (vm-error-free-call 'delete-file tempfile))))
  303.  
  304. ;; stupid yammering compiler
  305. (defvar vm-mouse-read-file-name-prompt)
  306. (defvar vm-mouse-read-file-name-dir)
  307. (defvar vm-mouse-read-file-name-default)
  308. (defvar vm-mouse-read-file-name-must-match)
  309. (defvar vm-mouse-read-file-name-initial)
  310. (defvar vm-mouse-read-file-name-history)
  311. (defvar vm-mouse-read-file-name-return-value)
  312. (defvar vm-mouse-read-file-name-should-delete-frame)
  313.  
  314. (defun vm-mouse-read-file-name (prompt &optional dir default
  315.                        must-match initial history)
  316.   "Like read-file-name, except uses a mouse driven interface.
  317. HISTORY argument is ignored."
  318.   (save-excursion
  319.     (or dir (setq dir default-directory))
  320.     (set-buffer (generate-new-buffer " *Files*"))
  321.     (use-local-map (make-sparse-keymap))
  322.     (setq buffer-read-only t
  323.       default-directory dir)
  324.     (make-local-variable 'vm-mouse-read-file-name-prompt)
  325.     (make-local-variable 'vm-mouse-read-file-name-dir)
  326.     (make-local-variable 'vm-mouse-read-file-name-default)
  327.     (make-local-variable 'vm-mouse-read-file-name-must-match)
  328.     (make-local-variable 'vm-mouse-read-file-name-initial)
  329.     (make-local-variable 'vm-mouse-read-file-name-history)
  330.     (make-local-variable 'vm-mouse-read-file-name-return-value)
  331.     (make-local-variable 'vm-mouse-read-file-name-should-delete-frame)
  332.     (setq vm-mouse-read-file-name-prompt prompt)
  333.     (setq vm-mouse-read-file-name-dir dir)
  334.     (setq vm-mouse-read-file-name-default default)
  335.     (setq vm-mouse-read-file-name-must-match must-match)
  336.     (setq vm-mouse-read-file-name-initial initial)
  337.     (setq vm-mouse-read-file-name-history history)
  338.     (setq vm-mouse-read-file-name-prompt prompt)
  339.     (setq vm-mouse-read-file-name-return-value nil)
  340.     (setq vm-mouse-read-file-name-should-delete-frame nil)
  341.     (if (and vm-mutable-frames vm-frame-per-completion
  342.          (vm-multiple-frames-possible-p))
  343.     (save-excursion
  344.       (setq vm-mouse-read-file-name-should-delete-frame t)
  345.       (vm-goto-new-frame 'completion)))
  346.     (switch-to-buffer (current-buffer))
  347.     (vm-mouse-read-file-name-event-handler)
  348.     (save-excursion
  349.       (local-set-key "\C-g" 'vm-mouse-read-file-name-quit-handler)
  350.       (recursive-edit))
  351.     ;; buffer could have been killed
  352.     (and (boundp 'vm-mouse-read-file-name-return-value)
  353.      (prog1
  354.          vm-mouse-read-file-name-return-value
  355.        (kill-buffer (current-buffer))))))
  356.  
  357. (defun vm-mouse-read-file-name-event-handler (&optional string)
  358.   (let ((key-doc "Click here for keyboard interface.")
  359.     start list)
  360.     (if string
  361.     (cond ((equal string key-doc)
  362.            (condition-case nil
  363.            (save-excursion
  364.              (setq vm-mouse-read-file-name-return-value
  365.                (save-excursion
  366.                  (vm-keyboard-read-file-name
  367.                   vm-mouse-read-file-name-prompt
  368.                   vm-mouse-read-file-name-dir
  369.                   vm-mouse-read-file-name-default
  370.                   vm-mouse-read-file-name-must-match
  371.                   vm-mouse-read-file-name-initial
  372.                   vm-mouse-read-file-name-history)))
  373.              (vm-mouse-read-file-name-quit-handler t))
  374.          (quit (vm-mouse-read-file-name-quit-handler))))
  375.           ((file-directory-p string)
  376.            (setq default-directory (expand-file-name string)))
  377.           (t (setq vm-mouse-read-file-name-return-value
  378.                (expand-file-name string))
  379.          (vm-mouse-read-file-name-quit-handler t))))
  380.     (setq buffer-read-only nil)
  381.     (erase-buffer)
  382.     (setq start (point))
  383.     (insert vm-mouse-read-file-name-prompt)
  384.     (vm-set-region-face start (point) 'bold)
  385.     (cond ((and (not string) vm-mouse-read-file-name-default)
  386.        (setq start (point))
  387.        (insert vm-mouse-read-file-name-default)
  388.        (vm-mouse-set-mouse-track-highlight start (point)))
  389.       ((not string) nil)
  390.       (t (insert default-directory)))
  391.     (insert ?\n ?\n)
  392.     (setq start (point))
  393.     (insert key-doc)
  394.     (vm-mouse-set-mouse-track-highlight start (point))
  395.     (vm-set-region-face start (point) 'italic)
  396.     (insert ?\n ?\n)
  397.     (setq list (vm-delete-backup-file-names
  398.         (vm-delete-auto-save-file-names
  399.          (vm-delete-index-file-names
  400.           (directory-files default-directory)))))
  401.     (vm-show-list list 'vm-mouse-read-file-name-event-handler)
  402.     (setq buffer-read-only t)))
  403.  
  404. (defun vm-mouse-read-file-name-quit-handler (&optional normal-exit)
  405.   (interactive)
  406.   (if vm-mouse-read-file-name-should-delete-frame
  407.       (vm-maybe-delete-windows-or-frames-on (current-buffer)))
  408.   (if normal-exit
  409.       (throw 'exit nil)
  410.     (throw 'exit t)))
  411.  
  412. (defvar vm-mouse-read-string-prompt)
  413. (defvar vm-mouse-read-string-completion-list)
  414. (defvar vm-mouse-read-string-multi-word)
  415. (defvar vm-mouse-read-string-return-value)
  416. (defvar vm-mouse-read-string-should-delete-frame)
  417.  
  418. (defun vm-mouse-read-string (prompt completion-list &optional multi-word)
  419.   (save-excursion
  420.     (set-buffer (generate-new-buffer " *Choices*"))
  421.     (use-local-map (make-sparse-keymap))
  422.     (setq buffer-read-only t)
  423.     (make-local-variable 'vm-mouse-read-string-prompt)
  424.     (make-local-variable 'vm-mouse-read-string-completion-list)
  425.     (make-local-variable 'vm-mouse-read-string-multi-word)
  426.     (make-local-variable 'vm-mouse-read-string-return-value)
  427.     (make-local-variable 'vm-mouse-read-string-should-delete-frame)
  428.     (setq vm-mouse-read-string-prompt prompt)
  429.     (setq vm-mouse-read-string-completion-list completion-list)
  430.     (setq vm-mouse-read-string-multi-word multi-word)
  431.     (setq vm-mouse-read-string-return-value nil)
  432.     (setq vm-mouse-read-string-should-delete-frame nil)
  433.     (if (and vm-mutable-frames vm-frame-per-completion
  434.          (vm-multiple-frames-possible-p))
  435.     (save-excursion
  436.       (setq vm-mouse-read-string-should-delete-frame t)
  437.       (vm-goto-new-frame 'completion)))
  438.     (switch-to-buffer (current-buffer))
  439.     (vm-mouse-read-string-event-handler)
  440.     (save-excursion
  441.       (local-set-key "\C-g" 'vm-mouse-read-string-quit-handler)
  442.       (recursive-edit))
  443.     ;; buffer could have been killed
  444.     (and (boundp 'vm-mouse-read-string-return-value)
  445.      (prog1
  446.          (if (listp vm-mouse-read-string-return-value)
  447.          (mapconcat 'identity vm-mouse-read-string-return-value " ")
  448.            vm-mouse-read-string-return-value)
  449.        (kill-buffer (current-buffer))))))
  450.  
  451. (defun vm-mouse-read-string-event-handler (&optional string)
  452.   (let ((key-doc  "Click here for keyboard interface.")
  453.     (bs-doc   "      .... to go back one word.")
  454.     (done-doc "      .... when you're done.")
  455.     start list)
  456.     (if string
  457.     (cond ((equal string key-doc)
  458.            (condition-case nil
  459.            (save-excursion
  460.              (setq vm-mouse-read-string-return-value
  461.                (vm-keyboard-read-string
  462.                 vm-mouse-read-string-prompt
  463.                 vm-mouse-read-string-completion-list
  464.                 vm-mouse-read-string-multi-word))
  465.              (vm-mouse-read-string-quit-handler t))
  466.          (quit (vm-mouse-read-string-quit-handler))))
  467.           ((equal string bs-doc)
  468.            (setq vm-mouse-read-string-return-value
  469.              (nreverse
  470.               (cdr
  471.                (nreverse vm-mouse-read-string-return-value)))))
  472.           ((equal string done-doc)
  473.            (vm-mouse-read-string-quit-handler t))
  474.           (t (setq vm-mouse-read-string-return-value
  475.                (nconc vm-mouse-read-string-return-value
  476.                   (list string)))
  477.          (if (null vm-mouse-read-string-multi-word)
  478.              (vm-mouse-read-string-quit-handler t)))))
  479.     (setq buffer-read-only nil)
  480.     (erase-buffer)
  481.     (setq start (point))
  482.     (insert vm-mouse-read-string-prompt)
  483.     (vm-set-region-face start (point) 'bold)
  484.     (insert (mapconcat 'identity vm-mouse-read-string-return-value " "))
  485.     (insert ?\n ?\n)
  486.     (setq start (point))
  487.     (insert key-doc)
  488.     (vm-mouse-set-mouse-track-highlight start (point))
  489.     (vm-set-region-face start (point) 'italic)
  490.     (insert ?\n)
  491.     (if vm-mouse-read-string-multi-word
  492.     (progn
  493.       (setq start (point))
  494.       (insert bs-doc)
  495.       (vm-mouse-set-mouse-track-highlight start (point))
  496.       (vm-set-region-face start (point) 'italic)
  497.       (insert ?\n)
  498.       (setq start (point))
  499.       (insert done-doc)
  500.       (vm-mouse-set-mouse-track-highlight start (point))
  501.       (vm-set-region-face start (point) 'italic)
  502.       (insert ?\n)))
  503.     (insert ?\n)
  504.     (vm-show-list vm-mouse-read-string-completion-list
  505.           'vm-mouse-read-string-event-handler)
  506.     (setq buffer-read-only t)))
  507.  
  508. (defun vm-mouse-read-string-quit-handler (&optional normal-exit)
  509.   (interactive)
  510.   (if vm-mouse-read-string-should-delete-frame
  511.       (vm-maybe-delete-windows-or-frames-on (current-buffer)))
  512.   (if normal-exit
  513.       (throw 'exit nil)
  514.     (throw 'exit t)))
  515.